<html>
<head>
  <title>Evernote Export</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="YXBJ Windows/602498 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="533"/>

<div>
<span><div><div>在使用maven创建项目时如果创建的是web工程需要pro.xml文件中的&lt;packaging&gt;war&lt;/packaging&gt;中指定为war包</div><div><br/></div><div>再写Impl层时如果我们把参数放入list集合中了，而query方法接收的是一个数组 所以我们需要在执行查询时 需要将集合转换为数组使用xxx.<span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(169, 183, 198); font-family: Consolas;">toArray();</span></div><div><span style="background-color: rgb(43, 43, 43);"><font style="font-size: 10pt;"><br/></font></span></div><div>在执行查询时，如果把参数放入list集合中，在执行查询时 需要使用<span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(204, 120, 50); font-family: Consolas;">ew</span> <span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(169, 183, 198); font-family: Consolas;">BeanListHandler&lt;？&gt;(？.</span><span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(204, 120, 50); font-family: Consolas;">class</span><span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(169, 183, 198); font-family: Consolas;">)</span></div><div><span style="font-size: 10pt;">如果是一个对象则使用new BeanHandeler&lt;对象&gt;(对象.class)</span></div><div><span style="background-color: rgb(43, 43, 43);"><font style="font-size: 10pt;"><br/></font></span></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><span style="font-size: 10pt;">服务器获取上传文件步骤</span></div><ol><li><div>通过request获取请求体的内容</div></li><li><div>解析请求体   多部件上传的特点：每一个input，都是一个表单项，根据分隔符将请求中的所有内容进行切割，获取到数组，数组中每一个元素就是一个表单项</div></li><li><div>遍历数组，分清哪个是普通上传项，哪个是文件上传项，判断是否有filename</div></li><li><div>获取普通上传项中的内容 通过属性 name获取</div></li><li><div>获取文件上传项</div></li><ol><li><div>文件名</div></li><li><div>文件内容</div></li></ol><li><div>使用IO将文件内容保存到服务器</div></li></ol><div><br/></div><div>如何区分保存操作还是修改操作</div><div>看请求参数：如果是新建课程不会携带ID字段 如果是修改操作则需要携带ID</div><div><br/></div><div><br/></div><div>Maven项目管理工具</div><div><br/></div><div>什么是Maven: Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目，其主要服务于 基于Java平台的项目创建，依赖管理和项目信息管理。maven是Apache的顶级项目，解释为“专家，内 行”，它是一个项目管理的工具，maven自身是纯java开发的，可以使用maven对java项目进行构建、 依赖管理。</div><div><br/></div><div>Maven作用：</div><ol><li><div>依赖管理：</div></li><ol><li><div>依赖指的就是是 我们项目中需要使用的第三方Jar包, 一个大一点的工程往往需要几十上百个 Jar包,按照我们之前的方式,每使用一种Jar,就需要导入到工程中,还要解决各种Jar冲突的问题.</div></li><li><div>Maven可以对Jar包进行统一的管理,包括快速引入Jar包,以及对使用的 Jar包进行统一的版本控 制</div></li></ol><li><div>一键构建项目</div></li><ol><li><div>之前我们创建项目,需要确定项目的目录结构,比如 src 存放Java源码, resources 存放配置文 件,还要配置环境比如JDK的版本等等,如果有多个项目 那么就需要每次自己搞一套配置,十分麻 烦</div></li><li><div>Maven为我们提供了一个标准化的Java项目结构,我们可以通过Maven快速创建一个标准的 Java项目</div></li></ol></ol><div><br/></div><div>Maven 仓库: 用来存放maven构建的项目和各种依赖的(Jar包)。</div><div><br/></div><div>仓库分类：</div><ol><li><div>本地仓库: 位于自己计算机中的仓库, 用来存储从远程仓库或中央仓库下载的插件和 jar 包，</div></li><li><div>远程仓库: 需要联网才可以使用的仓库，阿里提供了一个免费的maven 远程仓库。</div></li><li><div>中央仓库: 在 maven 软件中内置一个远程仓库地址 <a href="http://repo1.maven.org/maven2">http://repo1.maven.org/maven2</a> ，它是中 央仓库，服务于整个互联网，它是由 Maven 团队自己维护，里面存储了非常全的 jar 包，它包 含 了世界上大部分流行的开源项目构件</div></li></ol><div><br/></div><div><span style="color: unset; font-family: unset; font-size: unset;">创建Maven项目步骤</span><br/></div><div><span style="color: unset; font-family: unset; font-size: unset;"><br/></span></div><div><span style="color: unset; font-family: unset; font-size: unset;"><br/></span></div><ol><li><div>打开IDEA 创建一个新的project</div></li><li><div>打开IDEA 选择File --&gt; Settings --&gt; 搜素maven  —&gt; 修改默认配置配置</div></li><li><div>创建Maven工程</div></li><li><div>创建module -&gt;选中Maven-&gt;next</div></li><li><div>Maven工程改造-&gt; 当前创建的maven项目是一个 普通的Java项目,不是web项目,我们要进行一下改造-&gt; 在main目录下创建一个webapp文件夹 -&gt;  选择 project Structure ---&gt; facets---&gt; 点击+号 添加web ---&gt; 选择当前工程 -&gt; 修改路径信息-&gt; 修改为 我们的 webapp目录-&gt; 点击ok 后，项目就变为了web项目, 在webapp目录下再创建一个 index.jsp</div></li><li><div>pom核心配置文件: 一个 maven 工程都有一个 pom.xml 文件，通过 pom.xml 文件定义项目的信息、项目依赖、引入插 件等等。</div></li><ol><li><div>创建一个Servlet, 缺少jar包报错, 要解决问题，就是要将 servlet-api-xxx.jar 包放进来，作为 maven 工程应当添加 servlet的坐标，从而导入它的 jar</div></li><li><div>pom.xml 文件中引入依赖包的坐标: 一个Maven工程就是由 groupId ， artifactId 和 version 作为唯一标识, 我们在引用其他第三方 库的时候，也是通过这3个变量确定</div></li><ol><li><div>坐标的概念</div></li><ol><li><div>在maven中坐标就是为了定位一个唯一确定的jar包。</div></li><li><div>maven世界拥有大量构建，我们需要找一个用来唯一标识一个构建的统一规范，拥有了统一 规范，就可以把查找工作交给机器</div></li></ol><li><div>Maven坐标主要组成(GAV) - 确定一个jar在互联网位置</div></li><li><div>标签                               含义</div></li></ol></ol></ol><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> groupId                 定义当前Maven组织名称,通常是公司名<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> artifactId                 定义实际项目名称<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> version                   定义当前项目的当前版本<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> packaging               打包类型 jar：执行 package 会打成 jar 包 war：执行 package 会打成 war 包<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> dependency             使用 声明一个依赖后，Maven就会自动下载这个依赖包<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span></div><div><span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>4.</span> 坐标的来源方式： 添加依赖需要指定依赖 jar 包的坐标 可以通过<a href="https://mvnrepository.com/">https://mvnrepository.com/</a>查询<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    3.</span> 添加插件<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    4.</span> 运行Maven项目<br/></div><div><br/></div><div>Maven的常用命令</div><ol><li><div>一个maven项目生命周期： 使用 maven 完成项目的构建，项目构建包括：清理、编译、测试、部署等过程，maven 将这些 过 程规范为一个生命周期</div></li><li><div>maven 通过执行一些简单命令即可实现上边生命周期的各个过程</div></li><ol><li><div>命令                       说明</div></li></ol></ol><div>                  mvn compile        完成编译操作 , 执行完毕后，会生成target目录，该目录中存放了编译后的字节 码文件。</div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> mvn clean              执行完毕后，会将target目录删除<br/></div><div><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> mvn test             执行完毕后，会在target目录中生成三个文件夹： surefire、surefire-reports（测试报告）、test-classes（测试的字节码文件）<br/></div><div>                  mvn package          完成打包操作, 执行完毕后，会在target目录中生成一个文件，该文件可能是 jar、war</div><div>                   mvn install             执行 mvn install命令，完成将打好的jar包安装到本地仓库的操作 , 执行完毕后，会在本地仓库中出现安装后的jar包，方便其他工程引用</div><div><br/></div><div><font color="#1A90B9">JSON： JSON(JavaScript Object Notation) JavaScript对象表示法(JSON源于JS)</font></div><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9">特点：</font></div><ol><li><div><font color="#1A90B9">JSON 是一种轻量级的数据交换格式</font></div></li><li><div><font color="#1A90B9">JSON采用完全独立于语言的文本格式，就是说不同的编程语言JSON数据是一致的。</font></div></li><li><div><font color="#1A90B9">JSON易于人阅读和编写，同时也易于机器解析和生成(一般用于提升网络传输速率)。</font></div></li></ol><div><font color="#1A90B9">XML与JSON的区别：</font></div><ol><li><div><font color="#1A90B9">XML : 可扩展标记语言，是一种用于标记电子文件使其具有结构性的标记语言。</font></div></li><li><div><font color="#1A90B9">JSON: (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。</font></div></li><li><div><font color="#1A90B9">相同点: 它们都可以作为一种数据交换格式。</font></div></li><li><div><font color="#1A90B9">二者区别:</font></div></li><ol><li><div><font color="#1A90B9">XML是重量级的，JSON是轻量级的,XML在传输过程中比较占带宽，JSON占带宽少，易于压 缩。</font></div></li><li><div><font color="#1A90B9">XML和json都用在项目交互下，XML多用于做配置文件，JSON用于数据交互</font></div></li><li><div><font color="#1A90B9">JSON独立于编程语言存在,任何编程语言都可以去解析json</font></div></li></ol></ol><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9">3 JSON语法格式</font></div><ol><li><div><font color="#1A90B9">外面由{}括起来</font></div></li><li><div><font color="#1A90B9">数据以&quot;键：值&quot;对的形式出现（其中键多以字符串形式出现，值可取字符串，数值，甚至其他json 对象）</font></div></li><li><div><font color="#1A90B9">每两个&quot;键：值&quot;对以逗号分隔（最后一个&quot;键：值&quot;对省略逗号</font></div></li><li><div><font color="#1A90B9">. 参数值如果是string类型，就必须加引号，如果是数字类型，引号可加可不加 遵守上面4点，便可以形成一个json对象。</font></div></li></ol><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9">FastJson介绍：</font></div><ol><li><div><font color="#1A90B9">Fastjson 是一个 Java 库，可以将 Java 对象转换为 JSON 格式，当然它也可以将 JSON 字符串转换 为 Java 对象。</font></div></li><li><div><font color="#1A90B9">FastJson特点</font></div></li><ol><li><div><font color="#1A90B9">能够支持将java bean序列化成JSON字符串，也能够将JSON字符串反序列化成Java bean。</font></div></li><li><div><font color="#1A90B9">FastJson操作JSON的速度非常快的</font></div></li><li><div><font color="#1A90B9">无其他包的依赖, 使用比较方便。</font></div></li></ol></ol><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9">FastJson的使用：<span style="font-family: unset; font-size: unset;">在Maven项目中使用FastJson库，需要提前在Maven的配置文件中添加此FastJson包的依赖</span></font></div><div><span style="font-family: unset; font-size: unset;"><font color="#1A90B9"><br/></font></span></div><div><span style="font-family: unset; font-size: unset;"><font color="#1A90B9"><br/></font></span></div><div><font color="#1A90B9">将 Java 对象转换为 JSON 格式：</font></div><ol><li><div><font color="#1A90B9">定义一个名为 Person 的 JavaBean类</font></div></li><li><div><font color="#1A90B9">使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象：</font></div></li><li><div><font color="#1A90B9">Fastjson中的 @JSONField 注解：</font></div></li><ol><li><div><font color="#1A90B9">通过 @JSONField 我们可以自定义字段的名称进行输出，并控制字段的排序，还可以进行序列化 标记。</font></div></li><ol><li><div><font color="#1A90B9">指定name属性, 字段的名称</font></div></li><li><div><font color="#1A90B9">使用 ordinal属性, 指定字段的顺序</font></div></li><li><div><font color="#1A90B9">使用 serialize属性, 指定字段不序列化</font></div></li></ol></ol></ol><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9"><br/></font></div><div><font color="#1A90B9">JSON 字符串转换为 Java 对象</font></div><ol><li><div><font color="#1A90B9">JSON.parseObject()</font></div></li><ol><li><div><font color="#1A90B9">可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。</font></div></li><li><div><font color="#1A90B9">注意反序列化时为对象时，必须要有默认无参的构造函数，否则会报异常</font></div></li></ol><li><div><font color="#1A90B9">JSON.parseArray()： 使用 JSON.parseArray() 将 JSON 字符串转换为 集合对象。</font></div></li></ol><div><br/></div><div>postman: 是一款功能强大的http接口测试工具，使用postman可以完成http各种请求的功能测试。</div><div><br/></div><div><br/></div><div><font color="#A600C4">文件上传：</font></div><ol><li><div><font color="#A600C4">文件上传介绍：</font></div></li><ol><li><div><font color="#A600C4">文件上传的实质：文件的拷贝</font></div></li><ol><li><div><font color="#A600C4">文件上传：从本地将文件拷贝到服务器磁盘上</font></div></li><ol><li><div><font color="#A600C4">客户端: 需要编写文件上传表单</font></div></li><li><div><font color="#A600C4">服务端: 需要编写代码接受上传的 文件</font></div></li></ol></ol></ol></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">客户端编码：</font></div><ol><li><div><font color="#A600C4">文件上传三要素:</font></div></li><ol><li><div><font color="#A600C4">表单提交方式: post (get方式提交有大小限制,post没有)</font></div></li><li><div><font color="#A600C4">表单的enctype属性:必须设置为 multipart/form-data.</font></div></li><ol><li><div><font color="#A600C4">enctype就是encodetype就是编码类型的意思.</font></div></li><li><div><font color="#A600C4">multipart/form-data是多部件文件上传 , 指表单数据有多部分构成，既有文本数据，又有文 件等二进制数据的意思。</font></div></li></ol><li><div><font color="#A600C4">.表单必须有文件上传项: file ,必须要有name属性和值</font></div></li></ol></ol><div><font color="#A600C4">注意： 默认情况下，表单的enctype的值是application/x-www-form-urlencoded，不能用于文件 上传，只有使用了multipart/form-data，才能完整的传递文件数据</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">服务端编码：</font></div><ol><li><div><font color="#A600C4">上传文件, 抓包分析</font></div></li><li><div><font color="#A600C4">服务端获上传的文件</font></div></li><ol><li><div><font color="#A600C4">通过request获取请求体的内容</font></div></li><li><div><font color="#A600C4">.解析请求体 多部件上传的特点是,每个input都是一个表单项.  根据分隔符将请求中所有的内容,切割成数组,数组中的每一个元素 都是一个表单项</font></div></li><li><div><font color="#A600C4">遍历数组,分清楚那个是普通的表单项, 哪个是 文件上传项 如何区分? 判断是否有 filename</font></div></li><li><div><font color="#A600C4">获取到普通表单项中的内容,通过属性name获取</font></div></li><li><div><font color="#A600C4">获取文件上传项内容</font></div></li><ol><li><div><font color="#A600C4">文件名: filname = aaa.txt</font></div></li><li><div><font color="#A600C4">文件内容</font></div></li></ol><li><div><font color="#A600C4">使用IO将文件内容,保存到服务器中</font></div></li></ol></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">FileUpload工具类</font></div><ol><li><div><font color="#A600C4">导入依赖 </font></div></li><ol><li><div><font color="#A600C4">FileUpload包可以很容易地将文件上传到你的Web应用程序. </font></div></li><li><div><font color="#A600C4">IOUtils封装了Java中io的常见操作，使用十分方便 ,需要下载 commons-io-1.4.jar 包</font></div></li></ol></ol><div><font color="#A600C4">FileUpload 核心类介绍</font></div><div><font color="#A600C4">                类名                              介绍</font></div><div><font color="#A600C4">   DiskFileItemFactory                  判断是否是一个文件上传的表单</font></div><div><font color="#A600C4">ServletFileUplaod                        文件上传的一个核心类</font></div><div><font color="#A600C4">     <span style="font-family: unset; font-size: unset;">FileItem                                    </span> 代表每一个表单项</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">文件上传的API的详解</font></div><ol><li><div><font color="#A600C4">ServletFileUpload</font></div></li></ol><div><font color="#A600C4">                 </font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>方法                                              说明</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">isMultipartContent(request);                  判断是否是一个文件上传的表单</font></div><div><font color="#A600C4">parseRequest(request);                           解析request获得表单项的集合</font></div><div><font color="#A600C4">setHeaderEncoding(&quot;UTF-8&quot;);                 设置上传的文件名的编码方式</font></div><div><font color="#A600C4"><br/></font></div><ol start="2"><li><div><font color="#A600C4">FileItem</font></div></li></ol><div><font color="#A600C4">               <span>    </span><span>    </span><span> 方法                                                说明</span></font></div><div><font color="#A600C4"><span>                 </span> isFormField()                                         判断是否是普通表单项</font></div><div><font color="#A600C4">                 getFieldName()                                          获得表单的name属性值</font></div><div><font color="#A600C4">                item.getString()                                          获得表单的value值</font></div><div><font color="#A600C4">                      getName()                                                  获得上传文件的名称</font></div><div><font color="#A600C4">                     getInputStream()                                        获得上传文件</font></div><div><font color="#A600C4">                      delete()                                                        删除临时文件</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">文件上传后台代码编写</font></div><ol><li><div><font color="#A600C4">FileUpload使用步骤:</font></div></li><ol><li><div><font color="#A600C4">创建磁盘文件项工厂</font></div></li><li><div><font color="#A600C4">创建文件上传的核心类</font></div></li><li><div><font color="#A600C4">解析request---获得文件项集合</font></div></li><li><div><font color="#A600C4">遍历文件项集合</font></div></li><li><div><font color="#A600C4">判断普通表单项/文件上传项</font></div></li></ol></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">将图片上传到tomcat服务器</font></div><ol><li><div><font color="#A600C4">将项目部署到webapps       将部署方式改变为 war模式,把项目部署在tomcat的webapps下</font></div></li><li><div><font color="#A600C4">idea中部署项目两种方式</font></div></li><ol><li><div><font color="#A600C4">war模式：将项目以war包的形式上传真实到服务器的webapps目录中；</font></div></li><li><div><font color="#A600C4">war exploded模式：仅仅是目录的映射，就相当于tomcat在项目源文件夹中启动一样；</font></div></li></ol><li><div><font color="#A600C4">.在磁盘中webapps目录中创建upload目录： upload目录专门用来保存上传过来的图片</font></div></li></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">修改图片的输出路径</font></div><ol><li><div><font color="#A600C4">获取到项目的运行目录信息</font></div></li><li><div><font color="#A600C4">截取到webapps的 目录路径</font></div></li><li><div><font color="#A600C4">. 拼接输出路径,将图片保存到upload</font></div></li></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">页面加载图片： 将tomcat作为图片服务器使用时，存储上传的图片后,如果想要图片可以访问,需要在idea中进行配置:</font></div><ol><li><div><font color="#A600C4">选择external source ---&gt; 找到webapps目录下的的upload文件夹</font></div></li><li><div><font color="#A600C4">上传一张图片到服务器</font></div></li><li><div><font color="#A600C4">在项目内部页面加载图片</font></div></li><li><div><font color="#A600C4">也可以通过HTTP方式访问</font></div></li></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">BeanUtils工具类： BeanUtils 是 Apache commons组件的成员之一，主要用于简化JavaBean封装数据的操作。可以将 一个表单提交的所有数据封装到JavaBean中。</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">导入依赖：</font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    &lt;</span> dependency <span>&gt;</span><br/></font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    </span><span>    </span><span>    &lt;</span> groupId <span>&gt;</span> commons-beanutils <span>&lt;/</span> groupId <span><span>&gt;</span><br/></span></font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    </span><span>    </span><span>    &lt;</span> artifactId <span>&gt;</span> commons-beanutils <span>&lt;/</span> artifactId <span><span>&gt;</span><br/></span></font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    </span><span>    </span><span>    &lt;</span> version <span>&gt;</span> 1.8.3 <span>&lt;</span> /version <span><span>&gt;</span><br/></span></font></div><div><font color="#A600C4"><span>    </span><span>    </span><span>    &lt;/</span> dependency <span><span>&gt;</span><br/></span></font></div><div><span><font color="#A600C4"><br/></font></span></div><div><font color="#A600C4">BeanUtils 对象常用方法 </font></div><div><span><font color="#A600C4">                 </font></span></div><div><span><font color="#A600C4">                   方法                                                                                   描述</font></span></div><div><span><font color="#A600C4"><br/></font></span></div><div><font color="#A600C4">populate(Object bean, Map properties)                       将Map数据封装到指定Javabean中， 一般用于将表单的所有数据封装到 javabean </font></div><div><font color="#A600C4">setProperty(Object obj,String name,Object value)                      设置属性值 </font></div><div><font color="#A600C4">getProperty(Object obj,String name)                                           获得属性值<span>    </span><span>    </span><br/></font></div><div><span><font color="#A600C4"><br/></font></span></div><div><span><font color="#A600C4"><br/></font></span></div><div><font color="#A600C4">BeanUtils 使用测试步骤：</font></div><ol><li><div><font color="#A600C4">创建对象</font></div></li><li><div><font color="#A600C4">创建Map</font></div></li><li><div><font color="#A600C4">向map集合中添加数据, key要与course的属性名保持一致,value的数据类型与对象的属性的类型保持一致</font></div></li><li><div><font color="#A600C4">将map中的数据封装到对象中</font></div></li><li><div><font color="#A600C4">设置属性 获取属性</font></div></li></ol><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">Servlet编写： 因为上传的信息包含文件信息,无法直接通过request直接获取参数,所以不能继承BaseServlet 所以需要自己重新创建一个类继承HttpServlet</font></div><div><font color="#A600C4"><br/></font></div><div><font color="#A600C4">编写步骤：</font></div><ol><li><div><font color="#A600C4">创建对象</font></div></li><li><div><font color="#A600C4">创建Map集合,用来收集数据    代码： Map&lt;?,?&gt; map = new HashMap&lt;&gt;();</font></div></li><li><div><font color="#A600C4">创建磁盘工厂对象       代码L: DiskFileItemFactory factory = new DiskFileItemFactory();</font></div></li><li><div><font color="#A600C4">文件上传核心对象       代码： DiskFileItemFactory factory = new DiskFileItemFactory();</font></div></li><li><div><font color="#A600C4">解析request对象,获取表单项集合        代码:   List&lt; FileItem &gt; list = fileUpload.parseRequest(req);</font></div></li><li><div><font color="#A600C4">遍历集合 判断哪些是普通的表单项,哪些是文件表单项</font></div></li></ol><div><br/></div><div><br/></div><div>保存图片URL优化</div><ol><li><div>创建常量类</div></li><ol><li><div>代码： <font color="#328712">public final class Constants {</font></div></li></ol></ol><div><font color="#328712">                                                        //本地访问地址 </font></div><div><font style="color: rgb(50, 135, 18);"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>public static final String LOCAL_URL = &quot;<a href="http://localhost:8080/" style="color: rgb(26, 173, 224);">http://localhost:8080&quot;;</a> }</font></div><ol start="2"><li><div>拼接图片URL  代码： //将图片路径进行保存</div></li></ol><div><span style="color: unset; font-family: unset; font-size: unset;">                               </span> <span style="font-family: unset; font-size: unset;"><font style="color: rgb(50, 135, 18);"> map.put(&quot;course_img_url&quot;, Constants.LOCAL_URL+&quot;/upload/&quot; + newFileName);</font></span><br/></div><div><span style="font-family: unset; font-size: unset;"><font style="color: rgb(50, 135, 18);"><br/></font></span></div><div><span style="font-family: unset; font-size: unset;"><font style="color: rgb(50, 135, 18);"><br/></font></span></div><div><span style="font-family: unset; font-size: unset;"><font>数据库表中如果A表与B表是一对多关系：</font></span> 在 A类中定义一个List集合,并指定List的泛型是 B类型,表示A表中一个数据可以包含B表中多条数据信息</div><div>eg: Course类 </div><div><span>    </span>//添加list集合 泛型是 Course_Section </div><div><span>    </span><span>    </span><font style="color: rgb(50, 135, 18);">List sectionList = new ArrayList&lt;&gt;();</font></div><div><span style="color: rgb(50, 135, 18);">在B类中,定义一个A类型的属性, 用来保存章节所对应的具体的课程信息</span></div><div>eg: Course_Section 类 </div><div><span style="color: rgb(50, 135, 18);">//添加一个Course类型的属性</span></div><div><span style="color: rgb(50, 135, 18);"> private Course course;</span></div><div><font style="color: rgb(50, 135, 18);"><br/></font></div><div>如果B表与C表<span style="font-family: unset; font-size: unset;">是一对多关系：</span> 在 B类中定义一个List集合,并指定List的泛型是 C类型,表示B表中一个数据可以包含B表中多条数据信息</div><div><br/></div><div>eg:</div><div>Course_Section类 </div><div><font color="#328712">//添加一个list集合 泛型是 Course_lesson </font></div><div><font color="#328712">List lessonList = new ArrayList&lt;&gt;(); Course_Lesson类</font></div><div><font color="#328712"> //添加一个Course_Section类型的属性</font></div><div><font color="#328712"> private Course_Section course_section;</font></div><div><font color="#328712"><br/></font></div><div>在编写SQL语句时：我们在程序中应该尽量避免使用连接查询,我们可以将SQL语句进行拆分,每一条SQL对应一个功能</div><div><br/></div><div><br/></div><div>保存信息接口：</div><div><span style="color: unset; font-family: unset; font-size: unset;">POST请求方式介绍：</span></div><div>POST 请求方法常用的三种数据提交格式</div><div><br/></div><div>                          格式                                                                                         说明</div><div><br/></div><div><br/></div><div>Content-Type : application/x-www-formurlencoded                        请求体中的数据会以普通表单形式 （键值对）发送到后端。   </div><div><br/></div><div>Content-Type : application/json ; charset=utf-8                                 请求体中的数据会以json字符串的形式 发送到后端。</div><div><br/></div><div><span style="color: unset; font-family: unset; font-size: unset;">Content-Type : multipart/form-data                                                    </span> 多部件上传既可以上传键值对 也可以上传文 件。<br/></div><div><br/></div><div><font style="color: rgb(173, 0, 0);">注意： 第二种JSON格式与第三种多部件上传,使用 getParameter() 方法都无法获取数据</font></div><div><font style="color: rgb(173, 0, 0);"><br/></font></div><div><font style="color: rgb(173, 0, 0);"><br/></font></div><div><font color="#1AADE0">如果前台传输的是JSON格式的数据, 使用getParameter() 方法无法获取参数</font></div><div><font color="#1AADE0"><br/></font></div><div><font color="#1AADE0">这时候我们就应该修改 BaseServlet： 如果请求参数是JSON格式的数, 我们可以通过 request.getReader() 这个方法,获取一个流对象来进行 读取</font></div><ol><li><div><font color="#1AADE0">在BaseServlet 中创建一个方法,用来获取JSON格式的数据</font></div></li></ol><div><font color="#1AADE0">编写代码步骤：</font></div><ol><li><div><font color="#1AADE0">从request中获取 字符缓冲输入流对象       代码： BufferedReader reader = request.getReader();</font></div></li><li><div><font color="#1AADE0">创建 StringBuffer,用来保存读取出的数据         代码：  StringBuffer sb = new StringBuffer();</font></div></li><li><div><font color="#1AADE0">循环读取                   代码： String line = null;</font></div></li></ol><div><font color="#1AADE0">                                    while((line = reader.readLine()) != null)<span style="font-family: unset; font-size: unset;">{</span></font></div><div><span style="font-family: unset; font-size: unset;"><font color="#1AADE0">                                                        //追加到 StringBuffer中 </font></span></div><div><span style="font-family: unset; font-size: unset;"><font color="#1AADE0">                                                             sb.append(line); }</font></span></div><ol start="4"><li><div><font color="#1AADE0">将读取到的内容转换为字符串,并返回   代码： return sb.toString();</font></div></li></ol><div><font color="#1AADE0"><br/></font></div><div><font color="#1AADE0"><br/></font></div><ol start="2"><li><div><font color="#1AADE0">修改BaseServlet中的doGet方法</font></div></li><ol><li><div><font color="#1AADE0">获取POST请求的 Content-Type类型</font></div></li><li><div><font color="#1AADE0">.判断传递的数据是不是JSON格式</font></div></li><li><div><font color="#1AADE0">如果是 就调用上面编写的 getPostJSON方法,获取数据</font></div></li><li><div><font color="#1AADE0">将获取到的JSON格式的字符串转换为 Map</font></div></li><li><div><font color="#1AADE0">从Map中获取要调用的方法名</font></div></li><li><div><font color="#1AADE0">将Map保存到request域对象中 (流只能使用一次)</font></div></li></ol></ol><div><font color="#1AADE0"><br/></font></div><div><font color="#1AADE0">  代码编写步骤：</font></div><ol><li><div><font color="#1AADE0">获取参数 要访问的方法名                             代码：    String methodName = null;</font></div></li><li><div><font color="#1AADE0">获取POST请求的 Content-Type类型         代码： String contentType = req.getHeader(&quot;Content-Type&quot;);</font></div></li><li><div><font color="#1AADE0">判断传递的数据是不是JSON格式         代码： if(&quot;application/json;charset=utf-8&quot;.equals(contentType)){</font></div></li></ol><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//是JOSN格式 调用getPostJSON </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>String postJSON = getPostJSON(req); </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//将JSON格式的字符串转化为map </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>Map map = JSON.parseObject(postJSON, Map.class); </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//从map集合中获取 methodName </font></div><div><font color="#1AADE0"><span>    </span><span>   <span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span></span>methodName =(String) map.get(&quot;methodName&quot;); </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//将获取到的数据,保存到request域对象中 </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>req.setAttribute(&quot;map&quot;,map); </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>}<span style="font-family: unset; font-size: unset;">else{</span></font></div><div><font color="#1AADE0"> <span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>methodName = req.getParameter(&quot;methodName&quot;);</font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span> }</font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//判断 执行对应的方法 </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>if(methodName != null)</font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>{ //通过反射优化代码 提升代码的可维护性 </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//1.获取字节码文件对象</font></div><div><font color="#1AADE0"> <span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>Class c = this.getClass(); </font></div><div><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//根据传入的方法名,获取对应的方法对象 <span style="font-family: unset; font-size: unset;">findByName </span></font></div><div><span style="font-family: unset; font-size: unset;"><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>Method method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); </font></span></div><div><span style="font-family: unset; font-size: unset;"><font color="#1AADE0"><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span><span>    </span>//调用method对象的 invoke方法,执行对应的功能</font></span></div><div><span style="font-family: unset; font-size: unset;"><font color="#1AADE0">                                                                                                         method.invoke(this,req,resp); } </font></span></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div></div><div><br/></div></span>
</div></body></html> 